package com.daiqee.controller.support;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;

import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;

import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.plugins.Page;
import com.baomidou.mybatisplus.service.IService;
import com.daiqee.enums.RequestType;
import com.daiqee.pojo.AccountInfo;
import com.daiqee.pojo.GoodsList;
import com.daiqee.pojo.StockOut;
import com.daiqee.util.MyBatisPlusUtils;
import com.daiqee.util.WarpperStringUtils;
import com.daiqee.vo.BootstrapTablePageVO;
import com.daiqee.vo.JsonObjsVO;

import freemarker.template.utility.StringUtil;

/**
 * <p>定义了通用的CRUD操作</p>
 * <p>RESTFUL风格</p>
 * <p>GET    查询</p>
 * <p>PUT    修改</p>
 * <p>POST   添加</p>
 * <p>DELETE 删除</p>
 * 
 * CRUD这几个方法都是RESTFUL 风格,如果已有的方法和CRUD请求参数不同,造成的冲突,请使用别的路由来完成
 * 
 * E: 对应的Entity
 * O: other-其他类型
 * 
 * @since JDK 1.8
 * @version  V2.4.1
 * @author RichardTang 
 * @date: 2018年6月22日
 * @package com.daiqee.controller.support
 * @copyright:Copyright (c) 2018, 1245811923@qq.com All Rights Reserved.
 */
@SuppressWarnings("all")
public class CommonsController<E> extends BaseController implements IBaseWarpperMethod<E>{
	
	@Autowired
	protected IService<E> service;
	
	/**
	 * POST请求扩展
	 * @throws Exception 
	 */
	@Override
	public boolean warpperAddMethod(E e) throws Exception {
		return service.insert(e);
	}

	/**
	 * PUT请求扩展
	 */
	@Override
	public boolean warpperUpdateMethod(E e) {
		return service.updateById(e);
	}

	/**
	 * DELETE请求扩展
	 */
	@Override
	public boolean warpperDeleteMethod(String ids,List<String> idList) {
		return service.deleteBatchIds(idList);
	}
	
	/**
	 * GET请求扩展,默认情况下有分页条件着使用分页查询,没有分页条件着查询全部
	 */
	@Override
	public Object warpperQueryMethod(E e,String dateScope,EntityWrapper<E> ew,Page<E> page) {
		if(page != null) {
			return service.selectPage(page, ew);
		}
		return service.selectList(ew);
	}
	
	/**
	 * <p>统一 GET 请求条件查询方法</p>
	 * <p>根据实体中的值以及查询的日期范围来生成条件</p>
	 * <p>自动生成条件查询的EntityWarpper,复写WarpperQueryMethod时可以拿到该对象</p>
	 * @param entity 实体类POJO
	 * @param dateSocpe 查询的数据的日期范围
	 * @param limit 每页显示条数
	 * @param offset 当前页
	 */
	@RequestMapping(method = RequestMethod.GET)
	public Object query(E entity,String dateScope,String limit,String offset){
		//响应结果
		Object responseResult = null;
		//分页条件对象
		Page<E> page = null;
		//拼接日期范围查询条件
		EntityWrapper<E> ew = 
	        MyBatisPlusUtils.generatorEntityWrapperByEntityAndDateScope(entity, dateScope);
		if(StringUtils.isNoneBlank(limit) && StringUtils.isNoneBlank(offset)) {
			page = new Page<E>(Integer.parseInt(offset),Integer.parseInt(limit));
		}
		//调用service
		responseResult = warpperQueryMethod(entity,dateScope,ew,page);
		//如果响应的类型为Page就代表是使用了分页查询的service
		if(responseResult instanceof Page) {
			Page resultPage = (Page)responseResult;
			responseResult = new BootstrapTablePageVO(page.getPages(),page.getTotal(),page.getRecords());
		}
		return restfulResponse.response(responseResult, RequestType.GET);
	}
	
	/**
	 * <p>添加实体</p>
	 * <p>统一 POST 添加方法</p>
	 * 
	 * @param account 账户资料
	 * @throws Exception 
	 */
	@RequestMapping(method = RequestMethod.POST)
	public Object add(E entity) throws Exception{
		isNormalFinish = warpperAddMethod(entity);
		return restfulResponse.response(isNormalFinish, RequestType.POST);
	}
	
	/**
	 * <p>更新实体</p>
	 * <p>統一 PUT 更新方法</p>
	 * 
	 * @param account 新的账户资料
	 */
	@RequestMapping(method = RequestMethod.PUT)
	public Object update(E entity){
		isNormalFinish = warpperUpdateMethod(entity);
		return restfulResponse.response(isNormalFinish, RequestType.PUT);
	}
	
	/**
	 * <p>删除账号信息</p>
	 * <p>会自动将ids,中的字符串通过切割转换成List<String>集合</p>
	 * <p>复写warpperDeleteMethod方法就可以直接使用切割好后的ids</p>
	 * @param idsStr 需要被删除的id
	 */
	@RequestMapping(value = "/{ids}",method = RequestMethod.DELETE)
	public Object remove(@PathVariable("ids") String idsStr){
		List<String> idList = WarpperStringUtils.getIdListByCommaSplit(idsStr);
		isNormalFinish = warpperDeleteMethod(idsStr,idList);
		return restfulResponse.response(isNormalFinish, RequestType.DELETE);
	}
}
